WebAssembly ํ ์ด๋ธ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ก, ๋์ ํจ์ ํ ์ด๋ธ ๊ด๋ฆฌ, ํ ์ด๋ธ ์์ , ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ๊ณผ ๋ณด์์ ๋ฏธ์น๋ ์ํฅ์ ์ค์ ์ ์ผ๋ก ๋ค๋ฃน๋๋ค.
WebAssembly ํ ์ด๋ธ ์์ : ๋์ ํจ์ ํ ์ด๋ธ ๊ด๋ฆฌ
WebAssembly(Wasm)๋ ์น ๋ธ๋ผ์ฐ์ ์ ๋ ๋ฆฝํ ํ๊ฒฝ์ ํฌํจํ ๋ค์ํ ํ๋ซํผ์์ ์คํ๋ ์ ์๋ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ์ ๋ก ๋ถ์ํ์ต๋๋ค. WebAssembly์ ํต์ฌ ๊ตฌ์ฑ ์์ ์ค ํ๋๋ ํ ์ด๋ธ์ ๋๋ค. ํ ์ด๋ธ์ ๋ถํฌ๋ช ํ ๊ฐ, ์ผ๋ฐ์ ์ผ๋ก ํจ์ ์ฐธ์กฐ์ ๋์ ๋ฐฐ์ด์ ๋๋ค. ์ด ๊ธ์์๋ ๋์ ํจ์ ํ ์ด๋ธ ๊ด๋ฆฌ, ํ ์ด๋ธ ์์ , ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ๊ณผ ๋ณด์์ ๋ฏธ์น๋ ์ํฅ์ ํนํ ์ค์ ์ ๋๊ณ WebAssembly ํ ์ด๋ธ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
WebAssembly ํ ์ด๋ธ์ด๋ ๋ฌด์์ธ๊ฐ?
WebAssembly ํ
์ด๋ธ์ ๋ณธ์ง์ ์ผ๋ก ์ฐธ์กฐ์ ๋ฐฐ์ด์
๋๋ค. ์ด๋ฌํ ์ฐธ์กฐ๋ ํจ์๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ ๋ฟ๋ง ์๋๋ผ, ํ
์ด๋ธ์ ์์ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฅธ Wasm ๊ฐ์ ๊ฐ๋ฆฌํฌ ์๋ ์์ต๋๋ค. ํ
์ด๋ธ์ WebAssembly์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์๋ ๊ตฌ๋ณ๋ฉ๋๋ค. ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ ์์ ๋ฐ์ดํธ๋ฅผ ์ ์ฅํ๊ณ ๋ฐ์ดํฐ์ ์ฌ์ฉ๋๋ ๋ฐ๋ฉด, ํ
์ด๋ธ์ ํ์ํ๋ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ฉฐ ์ฃผ๋ก ๋์ ๋์คํจ์น ๋ฐ ๊ฐ์ ํจ์ ํธ์ถ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ปดํ์ผ ์ค์ ์ ์๋๋ ํ
์ด๋ธ์ ์์ ์ ํ์ ํ
์ด๋ธ์ ์ ์ฅํ ์ ์๋ ๊ฐ์ ์ข
๋ฅ๋ฅผ ์ง์ ํฉ๋๋ค(์: ํจ์ ์ฐธ์กฐ์ ๊ฒฝ์ฐ funcref, JavaScript ๊ฐ์ ๋ํ ์ธ๋ถ ์ฐธ์กฐ์ ๊ฒฝ์ฐ externref, ๋๋ "์ฐธ์กฐ ์ ํ"์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ํน์ Wasm ์ ํ).
ํ ์ด๋ธ์ ํจ์ ์งํฉ์ ๋ํ ์ธ๋ฑ์ค์ฒ๋ผ ์๊ฐํ ์ ์์ต๋๋ค. ํจ์๋ฅผ ์ด๋ฆ์ผ๋ก ์ง์ ํธ์ถํ๋ ๋์ , ํ ์ด๋ธ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถํฉ๋๋ค. ์ด๋ ๋์ ๋งํน์ ๊ฐ๋ฅํ๊ฒ ํ๊ณ ๊ฐ๋ฐ์๊ฐ ๋ฐํ์์ WebAssembly ๋ชจ๋์ ๋์์ ์์ ํ ์ ์๋๋ก ํ๋ ๊ฐ์ ์ฐธ์กฐ ์์ค์ ์ ๊ณตํฉ๋๋ค.
WebAssembly ํ ์ด๋ธ์ ์ฃผ์ ํน์ง:
- ๋์ ํฌ๊ธฐ: ํ ์ด๋ธ์ ๋ฐํ์ ์ค์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์์ด ํจ์ ์ฐธ์กฐ๋ฅผ ๋์ ์ผ๋ก ํ ๋นํ ์ ์์ต๋๋ค. ์ด๋ ๋์ ๋งํน๊ณผ ํจ์ ํฌ์ธํฐ๋ฅผ ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ํ์ํ๋ ์์: ๊ฐ ํ ์ด๋ธ์ ํน์ ์์ ์ ํ๊ณผ ์ฐ๊ด๋์ด ์์ด ํ ์ด๋ธ์ ์ ์ฅํ ์ ์๋ ์ฐธ์กฐ์ ์ข ๋ฅ๋ฅผ ์ ํํฉ๋๋ค. ์ด๋ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ๊ณ ์๋ํ์ง ์์ ํจ์ ํธ์ถ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ธ๋ฑ์ค ๊ธฐ๋ฐ ์ ๊ทผ: ํ ์ด๋ธ ์์๋ ์ซ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ๋ฏ๋ก ํจ์ ์ฐธ์กฐ๋ฅผ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์กฐํํ ์ ์์ต๋๋ค.
- ๊ฐ๋ณ์ฑ: ํ ์ด๋ธ์ ๋ฐํ์์ ์์ ๋ ์ ์์ต๋๋ค. ํ ์ด๋ธ์ ์์๋ฅผ ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ๊ต์ฒดํ ์ ์์ต๋๋ค.
ํจ์ ํ ์ด๋ธ๊ณผ ๊ฐ์ ํจ์ ํธ์ถ
WebAssembly ํ
์ด๋ธ์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ํจ์ ์ฐธ์กฐ(funcref)์
๋๋ค. WebAssembly์์ ๊ฐ์ ํจ์ ํธ์ถ(์ปดํ์ผ ํ์์ ๋์ ํจ์๋ฅผ ์ ์ ์๋ ํธ์ถ)์ ํ
์ด๋ธ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ์ด๋ Wasm์ด ๊ฐ์ฒด ์งํฅ ์ธ์ด์ ๊ฐ์ ํจ์๋ C ๋ฐ C++์ ๊ฐ์ ์ธ์ด์ ํจ์ ํฌ์ธํฐ์ ์ ์ฌํ ๋์ ๋์คํจ์น๋ฅผ ๋ฌ์ฑํ๋ ๋ฐฉ์์
๋๋ค.
์๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- WebAssembly ๋ชจ๋์ ํจ์ ํ ์ด๋ธ์ ์ ์ํ๊ณ ํจ์ ์ฐธ์กฐ๋ก ์ฑ์๋๋ค.
- ๋ชจ๋์๋ ํ
์ด๋ธ ์ธ๋ฑ์ค์ ํจ์ ์๊ทธ๋์ฒ๋ฅผ ์ง์ ํ๋
call_indirect๋ช ๋ น์ด๊ฐ ํฌํจ๋ฉ๋๋ค. - ๋ฐํ์์
call_indirect๋ช ๋ น์ด๋ ์ง์ ๋ ์ธ๋ฑ์ค์์ ํ ์ด๋ธ์ ํจ์ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. - ๊ฐ์ ธ์จ ํจ์๋ ์ ๊ณต๋ ์ธ์์ ํจ๊ป ํธ์ถ๋ฉ๋๋ค.
call_indirect ๋ช
๋ น์ด์ ์ง์ ๋ ํจ์ ์๊ทธ๋์ฒ๋ ํ์ ์์ ์ฑ์ ์ํด ๋งค์ฐ ์ค์ํฉ๋๋ค. WebAssembly ๋ฐํ์์ ํธ์ถ์ ์คํํ๊ธฐ ์ ์ ํ
์ด๋ธ์์ ์ฐธ์กฐ๋ ํจ์๊ฐ ์์๋ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํฉ๋๋ค. ์ด๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ณ ํ๋ก๊ทธ๋จ์ด ์์๋๋ก ๋์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์ : ๊ฐ๋จํ ํจ์ ํ ์ด๋ธ
WebAssembly๋ก ๊ฐ๋จํ ๊ณ์ฐ๊ธฐ๋ฅผ ๊ตฌํํ๋ ค๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ด ์๋ค. ๋ค์ํ ์ฐ์ ์ฐ์ฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๋ ํจ์ ํ ์ด๋ธ์ ์ ์ํ ์ ์์ต๋๋ค:
(module
(table $functions 10 funcref)
(func $add (param $p1 i32) (param $p2 i32) (result i32)
local.get $p1
local.get $p2
i32.add)
(func $subtract (param $p1 i32) (param $p2 i32) (result i32)
local.get $p1
local.get $p2
i32.sub)
(func $multiply (param $p1 i32) (param $p2 i32) (result i32)
local.get $p1
local.get $p2
i32.mul)
(func $divide (param $p1 i32) (param $p2 i32) (result i32)
local.get $p1
local.get $p2
i32.div_s)
(elem (i32.const 0) $add $subtract $multiply $divide)
(func (export "calculate") (param $op i32) (param $p1 i32) (param $p2 i32) (result i32)
local.get $op
local.get $p1
local.get $p2
call_indirect (type $return_i32_i32_i32))
(type $return_i32_i32_i32 (func (param i32 i32) (result i32)))
)
์ด ์์ ์์ elem ์ธ๊ทธ๋จผํธ๋ ํ
์ด๋ธ $functions์ ์ฒ์ ๋ค ๊ฐ ์์๋ฅผ $add, $subtract, $multiply, $divide ํจ์์ ๋ํ ์ฐธ์กฐ๋ก ์ด๊ธฐํํฉ๋๋ค. ๋ด๋ณด๋ธ(exported) ํจ์ calculate๋ ์ฐ์ฐ ์ฝ๋ $op์ ๋ ๊ฐ์ ์ ์ ๋งค๊ฐ๋ณ์๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ call_indirect ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ์ฐ ์ฝ๋์ ๋ฐ๋ผ ํ
์ด๋ธ์์ ์ ์ ํ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. type $return_i32_i32_i32๋ ์์๋๋ ํจ์ ์๊ทธ๋์ฒ๋ฅผ ์ง์ ํฉ๋๋ค.
ํธ์ถ์๋ ํ
์ด๋ธ์ ์ธ๋ฑ์ค($op)๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ
์ด๋ธ์ ํด๋น ์ธ๋ฑ์ค๊ฐ ์์๋ ์ ํ($return_i32_i32_i32)์ ํจ์๋ฅผ ๋ณด์ ํ๊ณ ์๋์ง ํ์ธํฉ๋๋ค. ๋ ๊ฒ์ฌ๊ฐ ๋ชจ๋ ํต๊ณผํ๋ฉด ํด๋น ์ธ๋ฑ์ค์ ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค.
๋์ ํจ์ ํ ์ด๋ธ ๊ด๋ฆฌ
๋์ ํจ์ ํ ์ด๋ธ ๊ด๋ฆฌ๋ ๋ฐํ์์ ํจ์ ํ ์ด๋ธ์ ๋ด์ฉ์ ์์ ํ๋ ๊ธฐ๋ฅ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค:
- ๋์ ๋งํน: ๋ฐํ์์ ์๋ก์ด WebAssembly ๋ชจ๋์ ๊ธฐ์กด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๋ํ๊ณ ์ฐ๊ฒฐํฉ๋๋ค.
- ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ: ํต์ฌ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ค์ ์ปดํ์ผํ์ง ์๊ณ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ ํ๋ฌ๊ทธ์ธ ์์คํ ์ ๊ตฌํํฉ๋๋ค.
- ํซ ์ค์ํ(Hot Swapping): ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ์ค๋จํ์ง ์๊ณ ๊ธฐ์กด ํจ์๋ฅผ ์ ๋ฐ์ดํธ๋ ๋ฒ์ ์ผ๋ก ๊ต์ฒดํฉ๋๋ค.
- ๊ธฐ๋ฅ ํ๋๊ทธ(Feature Flags): ๋ฐํ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ํน์ ๊ธฐ๋ฅ์ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํฉ๋๋ค.
WebAssembly๋ ํ ์ด๋ธ ์์๋ฅผ ์กฐ์ํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ช ๋ น์ด๋ฅผ ์ ๊ณตํฉ๋๋ค:
table.get: ์ฃผ์ด์ง ์ธ๋ฑ์ค์์ ํ ์ด๋ธ์ ์์๋ฅผ ์ฝ์ต๋๋ค.table.set: ์ฃผ์ด์ง ์ธ๋ฑ์ค์ ํ ์ด๋ธ์ ์์๋ฅผ ์๋๋ค.table.grow: ์ง์ ๋ ์๋งํผ ํ ์ด๋ธ์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฝ๋๋ค.table.size: ํ ์ด๋ธ์ ํ์ฌ ํฌ๊ธฐ๋ฅผ ๋ฐํํฉ๋๋ค.table.copy: ํ ํ ์ด๋ธ์์ ๋ค๋ฅธ ํ ์ด๋ธ๋ก ์์ ๋ฒ์๋ฅผ ๋ณต์ฌํฉ๋๋ค.table.fill: ํ ์ด๋ธ์ ์์ ๋ฒ์๋ฅผ ์ง์ ๋ ๊ฐ์ผ๋ก ์ฑ์๋๋ค.
์์ : ํ ์ด๋ธ์ ๋์ ์ผ๋ก ํจ์ ์ถ๊ฐํ๊ธฐ
์ด์ ๊ณ์ฐ๊ธฐ ์์ ๋ฅผ ํ์ฅํ์ฌ ํ ์ด๋ธ์ ๋์ ์ผ๋ก ์๋ก์ด ํจ์๋ฅผ ์ถ๊ฐํด ๋ด ์๋ค. ์ ๊ณฑ๊ทผ ํจ์๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค:
(module
(table $functions 10 funcref)
(import "js" "sqrt" (func $js_sqrt (param i32) (result i32)))
(func $add (param $p1 i32) (param $p2 i32) (result i32)
local.get $p1
local.get $p2
i32.add)
(func $subtract (param $p1 i32) (param $p2 i32) (result i32)
local.get $p1
local.get $p2
i32.sub)
(func $multiply (param $p1 i32) (param $p2 i32) (result i32)
local.get $p1
local.get $p2
i32.mul)
(func $divide (param $p1 i32) (param $p2 i32) (result i32)
local.get $p1
local.get $p2
i32.div_s)
(func $sqrt (param $p1 i32) (result i32)
local.get $p1
call $js_sqrt
)
(elem (i32.const 0) $add $subtract $multiply $divide)
(func (export "add_sqrt")
i32.const 4 ;; Index where to insert the sqrt function
ref.func $sqrt ;; Push a reference to the $sqrt function
table.set $functions
)
(func (export "calculate") (param $op i32) (param $p1 i32) (param $p2 i32) (result i32)
local.get $op
local.get $p1
local.get $p2
call_indirect (type $return_i32_i32_i32))
(type $return_i32_i32_i32 (func (param i32 i32) (result i32)))
)
์ด ์์ ์์๋ JavaScript์์ sqrt ํจ์๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ JavaScript import๋ฅผ ๊ฐ์ธ๋ WebAssembly ํจ์ $sqrt๋ฅผ ์ ์ํฉ๋๋ค. add_sqrt ํจ์๋ ํ
์ด๋ธ์ ๋ค์ ์ฌ์ฉ ๊ฐ๋ฅํ ์์น(์ธ๋ฑ์ค 4)์ $sqrt ํจ์๋ฅผ ๋ฃ์ต๋๋ค. ์ด์ ํธ์ถ์๊ฐ calculate ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก '4'๋ฅผ ์ ๋ฌํ๋ฉด ์ ๊ณฑ๊ทผ ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค.
์ค์ ์ฐธ๊ณ : ์ฌ๊ธฐ์๋ ์์๋ก JavaScript์์ sqrt๋ฅผ ๊ฐ์ ธ์์ต๋๋ค. ์ค์ ์๋๋ฆฌ์ค์์๋ ๋ ๋์ ์ฑ๋ฅ์ ์ํด ์ด์์ ์ผ๋ก WebAssembly๋ก ๊ตฌํ๋ ์ ๊ณฑ๊ทผ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ณด์ ๊ณ ๋ ค์ฌํญ
WebAssembly ํ ์ด๋ธ์ ๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ๋ช ๊ฐ์ง ๋ณด์ ๊ณ ๋ ค์ฌํญ์ ์ ๊ธฐํฉ๋๋ค:
- ํ์
ํผ๋(Type Confusion):
call_indirect๋ช ๋ น์ด์ ์ง์ ๋ ํจ์ ์๊ทธ๋์ฒ๊ฐ ํ ์ด๋ธ์์ ์ฐธ์กฐ๋ ํจ์์ ์ค์ ์๊ทธ๋์ฒ์ ์ผ์นํ์ง ์์ผ๋ฉด ํ์ ํผ๋ ์ทจ์ฝ์ ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. Wasm ๋ฐํ์์ ํ ์ด๋ธ์์ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์๊ทธ๋์ฒ ๊ฒ์ฌ๋ฅผ ์ํํ์ฌ ์ด๋ฅผ ์ํํฉ๋๋ค. - ๋ฒ์ ์ด๊ณผ ์ ๊ทผ(Out-of-Bounds Access): ํ ์ด๋ธ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์์์ ์ ๊ทผํ๋ฉด ์ถฉ๋์ด๋ ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ํญ์ ํ ์ด๋ธ ์ธ๋ฑ์ค๊ฐ ์ ํจํ ๋ฒ์ ๋ด์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. WebAssembly ๊ตฌํ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฒ์ ์ด๊ณผ ์ ๊ทผ์ด ๋ฐ์ํ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
- ์ด๊ธฐํ๋์ง ์์ ํ ์ด๋ธ ์์: ํ ์ด๋ธ์ ์ด๊ธฐํ๋์ง ์์ ์์๋ฅผ ํธ์ถํ๋ฉด ์ ์๋์ง ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฌ์ฉํ๊ธฐ ์ ์ ํ ์ด๋ธ์ ๋ชจ๋ ๊ด๋ จ ๋ถ๋ถ์ด ์ด๊ธฐํ๋์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
- ๊ฐ๋ณ ์ ์ญ ํ ์ด๋ธ: ํ ์ด๋ธ์ด ์ฌ๋ฌ ๋ชจ๋์์ ์์ ํ ์ ์๋ ์ ์ญ ๋ณ์๋ก ์ ์๋๋ฉด ์ ์ฌ์ ์ธ ๋ณด์ ์ํ์ ์ด๋ํ ์ ์์ต๋๋ค. ์๋ํ์ง ์์ ์์ ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ญ ํ ์ด๋ธ์ ๋ํ ์ ๊ทผ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ์ํ์ ์ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค:
- ํ ์ด๋ธ ์ธ๋ฑ์ค ๊ฒ์ฆ: ๋ฒ์ ์ด๊ณผ ์ ๊ทผ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ ์ด๋ธ ์์์ ์ ๊ทผํ๊ธฐ ์ ์ ํญ์ ํ ์ด๋ธ ์ธ๋ฑ์ค๋ฅผ ๊ฒ์ฆํ์ญ์์ค.
- ํ์ ์์ ํ ํจ์ ํธ์ถ ์ฌ์ฉ:
call_indirect๋ช ๋ น์ด์ ์ง์ ๋ ํจ์ ์๊ทธ๋์ฒ๊ฐ ํ ์ด๋ธ์์ ์ฐธ์กฐ๋ ํจ์์ ์ค์ ์๊ทธ๋์ฒ์ ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค. - ํ ์ด๋ธ ์์ ์ด๊ธฐํ: ์ ์๋์ง ์์ ๋์์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ ์ด๋ธ ์์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ํญ์ ์ด๊ธฐํํ์ญ์์ค.
- ์ ์ญ ํ ์ด๋ธ ์ ๊ทผ ์ ํ: ์๋ํ์ง ์์ ์์ ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ญ ํ ์ด๋ธ์ ๋ํ ์ ๊ทผ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํ์ญ์์ค. ๊ฐ๋ฅํ๋ฉด ์ ์ญ ํ ์ด๋ธ ๋์ ๋ก์ปฌ ํ ์ด๋ธ ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค.
- WebAssembly์ ๋ณด์ ๊ธฐ๋ฅ ํ์ฉ: ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ ๋ฐ ์ ์ด ํ๋ฆ ๋ฌด๊ฒฐ์ฑ๊ณผ ๊ฐ์ WebAssembly์ ๋ด์ฅ ๋ณด์ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ ์ฌ์ ์ธ ๋ณด์ ์ํ์ ๋์ฑ ์ํํ์ญ์์ค.
์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
WebAssembly ํ ์ด๋ธ์ ๋์ ํจ์ ๋์คํจ์น๋ฅผ ์ํ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ง๋ง, ๋ช ๊ฐ์ง ์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ๋ ์์ต๋๋ค:
- ๊ฐ์ ํจ์ ํธ์ถ ์ค๋ฒํค๋: ํ ์ด๋ธ์ ํตํ ๊ฐ์ ํจ์ ํธ์ถ์ ์ถ๊ฐ์ ์ธ ๊ฐ์ ์ฐธ์กฐ๋ก ์ธํด ์ง์ ํจ์ ํธ์ถ๋ณด๋ค ์ฝ๊ฐ ๋๋ฆด ์ ์์ต๋๋ค.
- ํ ์ด๋ธ ์ ๊ทผ ์ง์ฐ ์๊ฐ: ํ ์ด๋ธ ์์์ ์ ๊ทผํ๋ ๊ฒ์ ์ฝ๊ฐ์ ์ง์ฐ ์๊ฐ์ ์ ๋ฐํ ์ ์์ผ๋ฉฐ, ํนํ ํ ์ด๋ธ์ด ํฌ๊ฑฐ๋ ์๊ฒฉ ์์น์ ์ ์ฅ๋ ๊ฒฝ์ฐ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
- ํ ์ด๋ธ ํฌ๊ธฐ ์กฐ์ ์ค๋ฒํค๋: ํ ์ด๋ธ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ ๋น๊ต์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ผ ์ ์์ผ๋ฉฐ, ํนํ ํ ์ด๋ธ์ด ํฐ ๊ฒฝ์ฐ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
์ฑ๋ฅ์ ์ต์ ํํ๋ ค๋ฉด ๋ค์ ํ์ ๊ณ ๋ คํ์ญ์์ค:
- ๊ฐ์ ํจ์ ํธ์ถ ์ต์ํ: ๊ฐ์ ํจ์ ํธ์ถ์ ์ค๋ฒํค๋๋ฅผ ํผํ๊ธฐ ์ํด ๊ฐ๋ฅํ๋ฉด ์ง์ ํจ์ ํธ์ถ์ ์ฌ์ฉํ์ญ์์ค.
- ํ ์ด๋ธ ์์ ์บ์ฑ: ๋์ผํ ํ ์ด๋ธ ์์์ ์์ฃผ ์ ๊ทผํ๋ ๊ฒฝ์ฐ, ๋ก์ปฌ ๋ณ์์ ์บ์ฑํ์ฌ ํ ์ด๋ธ ์ ๊ทผ ์ง์ฐ ์๊ฐ์ ์ค์ด๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ํ ์ด๋ธ ํฌ๊ธฐ ์ฌ์ ํ ๋น: ํ ์ด๋ธ์ ๋๋ต์ ์ธ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์๊ณ ์๋ค๋ฉด, ์ฆ์ ํฌ๊ธฐ ์กฐ์ ์ ํผํ๊ธฐ ์ํด ํ ์ด๋ธ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ํ ๋นํ์ญ์์ค.
- ํจ์จ์ ์ธ ํ ์ด๋ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฌ์ฉ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ์ ๋ฐ๋ผ ์ ์ ํ ํ ์ด๋ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ํํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ํ ์ด๋ธ์์ ์์๋ฅผ ์์ฃผ ์ฝ์ ํ๊ณ ์ ๊ฑฐํด์ผ ํ๋ ๊ฒฝ์ฐ ๋จ์ ๋ฐฐ์ด ๋์ ํด์ ํ ์ด๋ธ ์ฌ์ฉ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
- ์ฝ๋ ํ๋กํ์ผ๋ง: ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ด๋ธ ์์ ๊ณผ ๊ด๋ จ๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์ต์ ํํ์ญ์์ค.
๊ณ ๊ธ ํ ์ด๋ธ ์์
๊ธฐ๋ณธ์ ์ธ ํ ์ด๋ธ ์์ ์ธ์๋ WebAssembly๋ ํ ์ด๋ธ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค:
table.copy: ํ ํ ์ด๋ธ์์ ๋ค๋ฅธ ํ ์ด๋ธ๋ก ์์ ๋ฒ์๋ฅผ ํจ์จ์ ์ผ๋ก ๋ณต์ฌํฉ๋๋ค. ์ด๋ ํจ์ ํ ์ด๋ธ์ ์ค๋ ์ท์ ๋ง๋ค๊ฑฐ๋ ํ ์ด๋ธ ๊ฐ์ ํจ์ ์ฐธ์กฐ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.table.fill: ํ ์ด๋ธ์ ์์ ๋ฒ์๋ฅผ ํน์ ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค. ํ ์ด๋ธ์ ์ด๊ธฐํํ๊ฑฐ๋ ๋ด์ฉ์ ์ฌ์ค์ ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.- ๋ค์ค ํ ์ด๋ธ: Wasm ๋ชจ๋์ ์ฌ๋ฌ ํ ์ด๋ธ์ ์ ์ํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ๋ฒ์ฃผ์ ํจ์ ๋๋ ๋ฐ์ดํฐ ์ฐธ์กฐ๋ฅผ ๋ถ๋ฆฌํ ์ ์์ผ๋ฉฐ, ๊ฐ ํ ์ด๋ธ์ ๋ฒ์๋ฅผ ์ ํํ์ฌ ์ฑ๋ฅ๊ณผ ๋ณด์์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก ๋ฐ ์์
WebAssembly ํ ์ด๋ธ์ ๋ค์์ ํฌํจํ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ฉ๋๋ค:
- ๊ฒ์ ๊ฐ๋ฐ: AI ํ๋ ๋ฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ๊ฐ์ ๋์ ๊ฒ์ ๋ก์ง์ ๊ตฌํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ ์ด๋ธ์ ๋ค์ํ ์ AI ํจ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ฒ์ ์ํ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์ ํ๋ ์ ์์ต๋๋ค.
- ์น ํ๋ ์์ํฌ: ๋ฐํ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ก๋ํ๊ณ ์คํํ ์ ์๋ ๋์ ์น ํ๋ ์์ํฌ๋ฅผ ๊ตฌ์ถํฉ๋๋ค. React์ ์ ์ฌํ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Wasm ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ : ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ์ฌ ๊ฐ๋ฐ์๊ฐ ํต์ฌ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ค์ ์ปดํ์ผํ์ง ์๊ณ ๋ ์๋ฒ์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋๋ก ํฉ๋๋ค. ๋น๋์ค ์ฝ๋ฑ์ด๋ ์ธ์ฆ ๋ชจ๋๊ณผ ๊ฐ์ ํ์ฅ์ ๋์ ์ผ๋ก ๋ก๋ํ ์ ์๋ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด ๋ณด์ญ์์ค.
- ์๋ฒ ๋๋ ์์คํ : ์๋ฒ ๋๋ ์์คํ ์์ ํจ์ ํฌ์ธํฐ๋ฅผ ๊ด๋ฆฌํ์ฌ ์์คํ ๋์์ ๋์ ์ฌ๊ตฌ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. WebAssembly์ ์์ ํํ๋ฆฐํธ์ ๊ฒฐ์ ๋ก ์ ์คํ์ ๋ฆฌ์์ค๊ฐ ์ ํ๋ ํ๊ฒฝ์ ์ด์์ ์ ๋๋ค. ๋ค๋ฅธ Wasm ๋ชจ๋์ ๋ก๋ํ์ฌ ๋์ ์ผ๋ก ๋์์ ๋ณ๊ฒฝํ๋ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ๋ฅผ ์์ํด ๋ณด์ญ์์ค.
์ค์ ์ฌ๋ก:
- Unity WebGL: Unity๋ WebGL ๋น๋๋ฅผ ์ํด WebAssembly๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํฉ๋๋ค. ํต์ฌ ๊ธฐ๋ฅ์ ๋๋ถ๋ถ์ AOT(Ahead-of-Time)๋ก ์ปดํ์ผ๋์ง๋ง, ๋์ ๋งํน ๋ฐ ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ๋ ์ข ์ข Wasm ํ ์ด๋ธ์ ํตํด ๊ตฌํ๋ฉ๋๋ค.
- FFmpeg.wasm: ์ธ๊ธฐ ์๋ FFmpeg ๋ฉํฐ๋ฏธ๋์ด ํ๋ ์์ํฌ๊ฐ WebAssembly๋ก ํฌํ ๋์์ต๋๋ค. ์ด๋ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ๋ค์ํ ์ฝ๋ฑ๊ณผ ํํฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ๋ฏธ๋์ด ์ฒ๋ฆฌ ๊ตฌ์ฑ ์์์ ๋์ ์ ํ ๋ฐ ๋ก๋๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ๋ค์ํ ์๋ฎฌ๋ ์ดํฐ: RetroArch ๋ฐ ๊ธฐํ ์๋ฎฌ๋ ์ดํฐ๋ Wasm ํ ์ด๋ธ์ ํ์ฉํ์ฌ ๋ค์ํ ์์คํ ๊ตฌ์ฑ ์์(CPU, GPU, ๋ฉ๋ชจ๋ฆฌ ๋ฑ) ๊ฐ์ ๋์ ๋์คํจ์น๋ฅผ ์ฒ๋ฆฌํ์ฌ ๋ค์ํ ํ๋ซํผ์ ์๋ฎฌ๋ ์ด์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
ํฅํ ๋ฐฉํฅ
WebAssembly ์ํ๊ณ๋ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์์ผ๋ฉฐ, ํ ์ด๋ธ ์์ ์ ๋์ฑ ํฅ์์ํค๊ธฐ ์ํ ์ฌ๋ฌ ๋ ธ๋ ฅ์ด ์งํ ์ค์ ๋๋ค:
- ์ฐธ์กฐ ์ ํ(Reference Types): ์ฐธ์กฐ ์ ํ ์ ์์ ํจ์ ์ฐธ์กฐ๋ฟ๋ง ์๋๋ผ ์์์ ์ฐธ์กฐ๋ฅผ ํ ์ด๋ธ์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ๋์ ํฉ๋๋ค. ์ด๋ WebAssembly์์ ๋ฐ์ดํฐ์ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection): ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ WebAssembly์ ํตํฉํ์ฌ Wasm ๋ชจ๋์์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒด๋ฅผ ๋ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ด๋ ํ ์ด๋ธ์ด ์ฌ์ฉ๋๊ณ ๊ด๋ฆฌ๋๋ ๋ฐฉ์์ ์๋นํ ์ํฅ์ ๋ฏธ์น ๊ฒ์ ๋๋ค.
- Post-MVP ๊ธฐ๋ฅ: ํฅํ WebAssembly ๊ธฐ๋ฅ์๋ ์์์ ํ ์ด๋ธ ์ ๋ฐ์ดํธ ๋ฐ ๋ ํฐ ํ ์ด๋ธ ์ง์๊ณผ ๊ฐ์ ๋ ๊ณ ๊ธ ํ ์ด๋ธ ์์ ์ด ํฌํจ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๊ฒฐ๋ก
WebAssembly ํ ์ด๋ธ์ ๋์ ํจ์ ๋์คํจ์น, ๋์ ๋งํน ๋ฐ ๊ธฐํ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฐ๋ ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ๊ธฐ๋ฅ์ ๋๋ค. ํ ์ด๋ธ์ ์๋ ๋ฐฉ์๊ณผ ํจ๊ณผ์ ์ธ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ์ดํดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๊ณ ์ฑ๋ฅ์ ์์ ํ๊ณ ์ ์ฐํ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
WebAssembly ์ํ๊ณ๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, ํ ์ด๋ธ์ ๋ค์ํ ํ๋ซํผ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋กญ๊ณ ํฅ๋ฏธ๋ก์ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฐ ์ ์ ๋ ์ค์ํ ์ญํ ์ ํ ๊ฒ์ ๋๋ค. ์ต์ ๊ฐ๋ฐ ๋ํฅ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด, ๊ฐ๋ฐ์๋ WebAssembly ํ ์ด๋ธ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ์ฌ ํ์ ์ ์ด๊ณ ์ํฅ๋ ฅ ์๋ ์๋ฃจ์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.